#ifndef DEFS
#define DEFS

#include<iostream>
#include<sstream>
#include<utility>
#include<cstdio>
#include<fstream>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<list>
#include <math.h>

#define forn(i,n) 	 for(int i=0; i<n; i++)
#define fornd(i,n) 	 for(int i=n-1; i>=0; i--)
#define fornx(i,x,n) for(int i=x; i<n; i++)

using namespace std;

/* Constantes. */
//~ const double epsilon = 0.1e-4;
const double epsilon 	= 0.1;
const int MAX 			= 100;

/* Typedefs. */

struct Punto
{
	double x;
	double y;	
	
	Punto()
	{
		x = 0;
		y = 0;
	}
	
	Punto(double X, double Y)
	{
		x = X;
		y = Y;
	}
};

typedef vector<Punto> 	vPunto;
typedef list<Punto> 	lPunto;
typedef vector<double>  vdouble;

struct Spline
{
	double a;
	double b;	
	double c;	
	double d;	
	
	double x_i;
	
	double min;
	double max;
	
	/* S(x) = d(x-x_i)^3 + c(x-x_i)^2 + b(x-x_i) + a. */	
	/* Interpolador cuando min <= x <= max */
};

typedef vector<Spline> 	vSpline;
typedef list<Spline> 	lSpline;

/* Spline natural.
 * 
 * S(xj) = f (xj) ∀j, j = 0, . . . , n
 *   Sj+1(xj+1) =   Sj(xj+1) ∀j, j = 0, . . . , n − 2 (continuidad).
 *  Sj+1'(xj+1) =  Sj'(xj+1) ∀j, j = 0, . . . , n − 2 (derivadas iguales de ambos lados).
 * Sj+1''(xj+1) = Sj''(xj+1) ∀j, j = 0, . . . , n − 2 (concavidades iguales de ambos lados).
 * S''(x0) = 0 y S''(xn) = 0
*/
#endif 
